package pers.cnzdy.tutorial.Chapter7_Data.Section1_File;

import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

import pers.cnzdy.tutorial.R;

// 将知识点保存到文件（恢复到界面显示）
// 文件保存到模拟器：/data/data/pers.cnzdy.tutorial/files/KnowledgeUnit
public class FileActivity extends AppCompatActivity {
    public static String TAG = "FileActivity";

    private String fileName = "KnowledgeUnit";
    private EditText editKPoint;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_file);
        editKPoint = findViewById(R.id.input_kpoint_edittext);

        //String inputKPointText = "Android系统采用了分层的架构，分为四个层，从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和Linux内核层。 （1）应用程序 Android装配一个核心应用程序集合，包括电子邮件客户端、SMS程序、日历、地图、浏览器、联系人和其他设置。所有应用程序都是用Java编程语言写的。更加丰富的应用程序有待我们去开发！ 从上面我们知道Android的架构是分层的，非常清晰，分工很明确。Android本身是一套软件堆叠(Software Stack)，或称为「软件叠层架构」，叠层主要分成三层：操作系统、中间件、应用程序。从上面我们也看到了开源的力量，一个个熟悉的开源软件在这里贡献了自己的一份力量。（2）应用程序框架 开发人员也可以完全访问核心应用程序所使用的API框架。该应用程序的架构设计简化了组件的重用；任何一个应用程序都可以发布它的功能块并且任何其它的应用程序都可以使用其所发布的功能块（不过得遵循框架的安全性）。同样，该应用程序重用机制也使用户可以方便的替换程序组件。隐藏在每个应用后面的是一系列的服务和系统， 其中包括；丰富而又可扩展的视图（Views)，可以用来构建应用程序， 它包括列表（Lists)，网格（Grids)，文本框（Text boxes)，按钮（Buttons)， 甚至可嵌入的web浏览器。 内容提供器（Content Providers)使得应用程序可以访问另一个应用程序的数据（如联系人数据库)，或者共享它们自己的数据资源管理器（Resource Manager)提供非代码资源的访问，如本地字符串，图形，和布局文件（Layout files )。 通知管理器 （Notification Manager) 使得应用程序可以在状态栏中显示自定义的提示信息。 活动管理器（ Activity Manager) 用来管理应用程序生命周期并提供常用的导航回退功能。";
        //editKPoint.setText(inputKPointText);

        String inputKPointText = load();

        if (!TextUtils.isEmpty(inputKPointText)) {
            editKPoint.setText(inputKPointText);
            editKPoint.setSelection(inputKPointText.length());

            Toast.makeText(this, "Restoring succeeded", Toast.LENGTH_SHORT).show();
        }
    }

    public void saveKPoint(View view) {
        if (editKPoint != null) {
            String inputText = editKPoint.getText().toString();
            save(inputText);
        }
    }

    public void save(String inputKPoint) {
        FileOutputStream out = null;
        BufferedWriter writer = null;

        Log.d(TAG, fileName);

        try {
            out = openFileOutput(fileName, Context.MODE_PRIVATE);
            writer = new BufferedWriter(new OutputStreamWriter(out));
            writer.write(inputKPoint);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (writer != null)
                    writer.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public String load() {
        FileInputStream in = null;
        BufferedReader reader = null;
        StringBuilder content = new StringBuilder();
        try {
            in = openFileInput(fileName);
            reader = new BufferedReader(new InputStreamReader(in));
            String line = "";
            while ((line = reader.readLine()) != null) {
                content.append(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return content.toString();
    }
}
